package com.wt.admin.domain.entity.language;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.wt.admin.config.JacksonTypeHandler;
import lombok.Data;
import org.dromara.easyai.config.SentenceConfig;
import org.dromara.easyai.config.TfConfig;


@Data
@TableName(value = "language_sentence_config")
public class SentenceConfigEntity{

    @TableId(value = "tag")
    private String tag;

    /**
     * 语义分类的种类数。
     */
    @TableField(value = "type_nub")
    private Integer typeNub;

    /**
     * 语义分类词向量维度。该词向量维度越大，则对越复杂的语义及语句结构表达性越好，但运算速度也越慢。
     */
    @TableField(value = "word_vector_dimension")
    private Integer wordVectorDimension;

    /**
     * 问答词向量维度,该词向量维度越大，则对越复杂的语义及语句结构表达性越好，但运算速度也越慢。
     */
    @TableField(value = "qa_word_vector_dimension")
    private Integer qaWordVectorDimension;

    /**
     * 用户输入语句最大长度,若输入语句超过该长度，超出部分将被忽略。
     */
    @TableField(value = "max_word_length")
    private Integer maxWordLength;

    /**
     * 词向量学习率
     */
    @TableField(value = "we_study_point")
    private Double weStudyPoint;

    /**
     * 词向量正则系数
     */
    @TableField(value = "we_l_param")
    private Double weLParam;

    /**
     * 是否在学习过程中打印数据。
     */
    @TableField(value = "show_log")
    private Boolean showLog = false;

    /**
     * 小于该输入语句长度的输入语句，训练时不进行跳层
     */
    @TableField(value = "min_length")
    private Integer minLength;

    /**
     * 语义分类可信阈值。
     */
    @TableField(value = "trust_power_th")
    private Double trustPowerTh;

    /**
     * 问答最长回答长度。若输入语句超过该长度，超出部分将被忽略。
     */
    @TableField(value = "max_answer_length")
    private Integer maxAnswerLength;

    /**
     * 回答语句最大可信阈值
     */
    @TableField(value = "sentence_trust_power_th")
    private Double sentenceTrustPowerTh;

    /**
     * 回答语句训练增强次数，同时增加词向量训练循环次数
     * QA模型训练时间复杂度为 times * maxWordLength * maxAnswerLength
     */
    @TableField(value = "times")
    private Integer times;

    /**
     * QA网络学习正则系数
     */
    @TableField(value = "param")
    private Double param;

    /**
     * 关键词敏感性嗅探颗粒度
     */
    @TableField(value = "key_word_nerve_deep")
    private Integer keyWordNerveDeep;

    /**
     * 正则模式，选取不同的正则模式带来不同效果的强化，它是基于对神经元权重施加惩罚，提升权重稀疏性来实现效果的提升。
     * RZ.NOT_RZ时即无正则模式，无正则模式即不对权重施加惩罚，或者样本数据量较为大充足时，样本规律性较强，可直接使用无正则模式。
     * RZ.L1时，为L1正则模式，当出现异常值，或者未见过的异常噪音时，L1的鲁棒性非常强。它是以简化模型，突出重点权重的方式来增强其稳定性与鲁棒性的。
     * RZ.L2时，为L2正则模式，它更容易调动全部参数特征，让特征平均的落在每个权重上，误差最容易最快下降到最优解的位置上。面对形态多变且种类复杂，或者维度比较大的情况下，能获得最好的优化效果。
     */
    @TableField(value = "rz_model")
    private Integer rzModel;

    @TableField(value = "tf",typeHandler = JacksonTypeHandler.class)
    private TfConfig tf;


    public SentenceConfig getSentenceConfig() {
        return BeanUtil.copyProperties(this, SentenceConfig.class);
    }

    public TfConfig getTfConfig() {
        return BeanUtil.copyProperties(this.tf, TfConfig.class);
    }


}
